package locadora.negocio;

import locadora.dados.RepositorioItem;
import locadora.dados.RepositorioPessoa;
import locadora.negocio.pessoas.Cliente;
import locadora.negocio.produtos.Item;
import miscelanea.Data;

public class Devolucao {
	
	
	public Devolucao(){}
	
	/**
	 * Calcula o débito do material entregue 
	 * @param cliente Cliente a quem está sendo atribuído o débito
	 * @param item Item sendo entregue
	 * @param dataDevolucao data da REAL devolução do Item. Não confundir com a data de devolução prevista.
	 * @return
	 */
	private static void calculaDebitoNormal(Cliente cliente, Item item, Data dataDevolucao){
		int diferenca;
		diferenca = dataDevolucao.diferenca(item.getDataLocacao());
		cliente.debitar(diferenca*item.getValorAluguel());
	}
	
	/**
	 * Caso o Cliente tenha entregue o Item após a data prevista, adiciona o valor da multa prevista sobre o valor da
	 * locação para cada dia de atraso
	 * @param cliente Cliente a quem será atribuída a multa
	 * @param item Item que está sendo devolvido
	 * @param dataDevolucao data da REAL devolução do Item. Não confundir com a data de devolução prevista.
	 * @param adicionalPorAtraso
	 */
	private static void calculaMulta(Cliente cliente, Item item, Data dataDevolucao, float adicionalPorAtraso) {
		int diferencaDias = 0;
		diferencaDias = item.getDataDevolucao().diferenca(dataDevolucao);
		if(diferencaDias > 0 ){
			cliente.debitar(diferencaDias * (1 + adicionalPorAtraso) * item.getValorAluguel());
		}
	}
	/**
	 * Realiza a devulução de um Item, dando baixa da lista de materiais pendentes do cliente e atualizando o calculo da
	 * situação financeira deste. Caso o cliente queira pagar uma parte da dívida, ele poderá fazê-lo. Caso o cliente tenha
	 * entregue o material além da data prevista, este pagará um adicional de X% por dia de atraso sobre o valor do aluguel do Item
	 * @param chavePessoa chave única do Cliente locador
	 * @param chaveItem chave única do Item alugado
	 * @param dataDevolucao data da devolução. Não confundir com a data prevista para entrega constante em cada Item.
	 * @param adicionalPorAtraso porcentagem sobre o valor da locação do Item a ser cobrado por cada dia de atraso.
	 * @param credito valor a ser creditado na conta do Cliente.
	 * @throws Exception
	 */
	public static void devolverItem(String chavePessoa, String chaveItem, Data dataDevolucao, float adicionalPorAtraso, float credito) throws Exception{
		RepositorioPessoa repositorioPessoa = new RepositorioPessoa();
		RepositorioItem repositorioItem = new RepositorioItem();
		Cliente cliente = (Cliente)repositorioPessoa.busca(chavePessoa);
		Item item = repositorioItem.busca(chaveItem);
		if(cliente == null){
			throw new Exception("Cliente inexistente!!");
		}else if(item == null){
			throw new Exception("Item inexistente");
		}else{
			//Se a data da devolução do produto for maior que a prevista para a entrega do Item
			calculaDebitoNormal(cliente, item, dataDevolucao);
			calculaMulta(cliente, item, dataDevolucao, adicionalPorAtraso);
			//Desassocia o cliente do Item entregue
			item.setLocador(null);
			item.setDataDevolucao(dataDevolucao);
			//Desassocia o Item da lista de pendencias do locador
			cliente.removePendenciaMaterial(Long.decode(chaveItem));
		}
	}
	
}
